package com.invengo.library_rfid.analyze.utils.uhf.formatHelp;

import com.invengo.library_rfid.analyze.utils.uhf.utils.Convert;

/**
 * 改版后的EPC数据类
 */
public class CEpcCodeEx {
    /**
     * 格式化结果
     */
    private boolean bFormatResult;

    /**
     * 格式化结果
     */
    public boolean getBFormatResult() {
        return bFormatResult;
    }

    public void setBFormatResult(boolean value) {
        bFormatResult = value;
    }

    /**
     * 行业标识
     */
    public long m_lBussinessID = 0;
    /**
     * 馆代码
     */
    public long m_lLibCode = 0;
    /**
     * 馆藏代码
     * 又称为分拣码 yxwu 2012.11.16
     */
    public long m_lLocation = 0;
    /**
     * 分拣口代码
     * 0表示容错口，1~31表示分拣口
     * yxwu 2014.10.13
     */
    public long m_lSortPort = 0;
    /**
     * 标签类型
     * 0：图书标签，1：层标，2：架标，3：借书卡标签
     */
    public long m_lTagType = 0;
    /**
     * 流通标识
     */
    public long m_lStatus = 0;
    /**
     * EPC码长度，单位：字节
     * 一代标签为96位，12字节
     * 二代标签为240位，30字节 图书标签存储格式为version2
     * 添加人：吴永祥，2011年3月8日
     */
    public byte m_nEPCLength = 12;
    /**
     * 版本号
     */
    public long m_lVersion = 1;
    /**
     * EAS防盗位
     */
    public long m_lEAS = 1;
    /// <summary>
    /// 保留字段
    /// </summary>
    public long m_lRemain = 0;
    /// <summary>
    /// 条码号 version2
    /// </summary>
    public String m_szID = "";

    /// <summary>
    /// 图书条码号的长度  version2
    /// </summary>
    public long m_lIDLength = 0;

    /**
     * 内存索引
     */
    public CContentIndex m_contentIndex;
    /**
     * 扩展的档案信息
     */
    public CExtendArchiveInfo m_extend_archive_info;

    /**
     * 构造函数
     */
    public CEpcCodeEx() {
        m_contentIndex = new CContentIndex();
        m_extend_archive_info = null;
    }

    /**
     * 构造函数
     *
     * @param byData 数据
     */
    public CEpcCodeEx(byte[] byData) throws Exception {
        m_contentIndex = new CContentIndex();
        if (byData.length < 12) {
            throw new Exception("CEpcCodeEx的EPC数据小于12，无法解析!");
        }
        CBitClass tmpBitClass = new CBitClass(byData);
        switch ((int) tmpBitClass.GetValue(90, 4)) {
            case 1:
                FormatVersion1(byData);
                break;
            case 2:
                FormatVersion2(byData);
                break;
            case 3:
                FormatVersion3(byData);
                break;
            case 4:
                FormatVersion4(byData);
                break;
            default:
                //throw new Exception("标签版本有误");
                break;
        }
    }

    /**
     * 返回EPC数据的Bit数组
     *
     * @param byResult Bit数组
     * @return 成功返回1
     * 该函数对CEpcCodeEx无效
     */
    public int GetBytes(byte[] byResult) throws Exception {
        return 1;
    }

    /**
     * 构建EPC数据（标签版本1）
     *
     * @param bitClass
     */
    public void AddBitsVersion1(CBitClass bitClass) {
    }

    /**
     * 格式化数据（标签版本1）
     *
     * @param byData 数据
     * @return 成功返回true，否则返回false
     */
    public boolean FormatVersion1(byte[] byData) throws Exception {
        return true;
    }

    /**
     * 高校数据模型，版本1，压缩条码
     *
     * @param byData
     * @return
     */
    public boolean FormatVersion1011(byte[] byData) {
        return true;
    }

    /**
     * 高校数据模型，版本1，压缩条码
     *
     * @param byData
     * @return
     */
    public boolean FormatVersion1012(byte[] byData) {
        try {
            CBitClassFromLow bitClass = new CBitClassFromLow(byData);
            m_lStatus = 1;//直接标识为可流通
            m_lTagType = 0;
            m_lBussinessID = 0x00;
            m_nEPCLength = 16;
            //EPC前2个bits位
            m_lLocation = bitClass.getValue(0, 5);      //分拣位，0~4，共5bits  128
            m_lSortPort = m_lLocation;

            m_lRemain = bitClass.getValue(5, 2);        //保留，5~6，共2bits
            //m_lEAS = bitClass.GetValue(7, 1);           //安全位，7，共1bits
            m_lEAS = 1 - bitClass.getValue(7, 1);           //安全位，7，共1bits                标签中防盗时存为0，不防盗存为1

            long tmp2 = bitClass.getValue(8, 6) + 1;       //版本号//压缩码与版本号位置互换
            long encodetype = bitClass.getValue(14, 2) + 1;  //压缩码

            m_lVersion = Convert.ToInt64('1' + String.format("%02d",tmp2) + Long.toString(encodetype));//形成版本号字段

            //long lcontentindex = bitClass.GetValue(16, 16);
            //m_contentIndex.SetValue(lcontentindex);
            long tmpIndex1 = bitClass.getValue(16, 8); //content index
            long tmpIndex2 = bitClass.getValue(24, 8); //content index
            m_contentIndex.SetContentIndex(String.format("%8s",Convert.ToString(tmpIndex1,2).replace(" ","0"))
                    + String.format("%8s",Convert.ToString(tmpIndex2,2).replace(" ","0")));
            byte[] byBarCode = new byte[12];
            //for (int i = 0; i < 12; i++)
            //{
            //    byBarCode[i] = byData[i + 4];
            //}
            for (int i = 0; i < byData.length - 4; i++) {
                byBarCode[i] = byData[i + 4];
            }
            dm_barcode_fromlow barcode_sjtu = new dm_barcode_fromlow();
            m_szID = barcode_sjtu.Decode_sjtu_128(byBarCode);
            m_lIDLength = m_szID.length();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
//            throw new Exception("解析图书标签版本(数据模型_压缩模式00)出错：" + e.getMessage() + " " + e.getStackTrace());
            return false;
        }
    }

    /**
     * 高校数据模型，版本1，不压缩条码
     *
     * @param byData
     * @return
     */
    public boolean FormatVersion1010(byte[] byData) {
        return true;
    }

    /**
     * 高校数据模型，版本1，压缩条码
     *
     * @param bitClass
     */
    public void AddBitsVersion1011(CBitClassFromLow bitClass) {
    }

    /**
     * 高校数据模型，版本1，不压缩条码
     *
     * @param bitClass
     */
    public void AddBitsVersion1010(CBitClassFromLow bitClass) {
    }

    /**
     * 高校数据模型，版本1，压缩条码
     *
     * @param bitClass
     */
    public void AddBitsVersion1012(CBitClassFromLow bitClass) {
    }

    /**
     * 构建EPC数据（标签版本2）
     *
     * @param bitClass
     */
    public void AddBitsVersion2(CBitClass bitClass) throws Exception {
    }

    /**
     * 构建EPC数据（标签版本3）
     *
     * @param bitClass
     */
    public void AddBitsVersion3(CBitClass bitClass) throws Exception {
    }

    /**
     * 格式化数据（标签版本2）
     *
     * @param byData
     * @return
     */
    public boolean FormatVersion2(byte[] byData) throws Exception {
        return true;
    }

    /**
     * 格式化数据（标签版本3）
     *
     * @param byData
     * @return
     */
    public boolean FormatVersion3(byte[] byData) {
        return true;
    }

    /**
     * 构建EPC数据（标签版本4）
     *
     * @param bitClass
     */
    public void AddBitsVersion4(CBitClass bitClass) {
    }

    /**
     * 格式化数据（标签版本4）
     *
     * @param byData 数据
     * @return 成功返回true，否则返回false
     */
    public boolean FormatVersion4(byte[] byData) {
        return true;
    }

    /**
     * 构建EPC数据（标签版本11）
     *
     * @param bitClass
     */
    public void AddBitsVersion11(CBitClass bitClass) {
    }

    /**
     * 格式化数据（标签版本11）
     *
     * @param byData 数据
     * @return 成功返回true，否则返回false
     */
    public boolean FormatVersion11(byte[] byData) {
        return true;
    }

    /**
     * 构建EPC数据（标签版本12）
     *
     * @param bitClass
     */
    public void AddBitsVersion12(CBitClass bitClass) {
    }

    /**
     * 格式化数据（标签版本12）
     *
     * @param byData 数据
     * @return 成功返回true，否则返回false
     */
    public boolean FormatVersion12(byte[] byData) {
        return true;
    }

    /**
     * 构建EPC数据（标签版本12）
     *
     * @param bitClass
     */
    public void AddBitsVersion28560(CBitClass bitClass) {
    }

    /**
     * 格式化数据（标签版本12）
     *
     * @param byData 数据
     * @return 成功返回true，否则返回false
     */
    public boolean FormatVersion28560(byte[] byData) {
        return true;
    }

    /**
     * 返回EPC数据
     *
     * @return 返回EPC数据
     */
    @Override
    public String toString() {
        return "";
    }

    /**
     * 强制转换为老版本EPCode类型
     *
     * @param epcCodeEx 新版本标签数据
     * @return 转换后的老标签数据
     * 只用于兼容老程序，不建议使用
     */
    static public CEpcCode implicitOperator(CEpcCodeEx epcCodeEx) {
        CEpcCode epcCode = new CEpcCode();
        epcCode.m_lLibCode = epcCodeEx.m_lLibCode;
        epcCode.m_lLibTagType = epcCodeEx.m_lTagType;
        //epcCode.m_lRemain1      = epcCodeEx.m_lID;
        epcCode.m_lRemain2 = epcCodeEx.m_lEAS;
        //epcCode.m_lSerialID     = epcCodeEx.m_lID;
        return epcCode;
    }
}


